package com.lw.testvolatile;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author LW
 * @2020/8/21 15:32
 */
public class volatileA {

    //volatile不保证原子性    所以这里没起作用
    //变成了原子类的
    private volatile static AtomicInteger num = new AtomicInteger();

    /**
     * 怎么保证原子性？
     * 1.synchronized和lock   *****更耗费资源
     * 2.原子类
     */
    public  static void add(){
//        num++;//不是原子操作
        //有的线程取得旧的值   所以就少了
        /**1.获得这个值
         * 2.+1
         * 3.写回这个值
         */
//        AtomicInteger有++的方法：  获取和增加1
        //getAndIncrement()用的是 底层的CAS
        num.getAndIncrement();//相当于num++
    }

    public static void main(String[] args) {

        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                for (int i1 = 0; i1 < 1000; i1++) {
                    add();
                }
            }).start();
        }
        //看线程没有执行完
        while (Thread.activeCount()>2){//活跃的线程大于2（两个默认线程main和gc）
            Thread.yield();
        }
        System.out.println(Thread.currentThread().getName()+"==num-->"+num);
    }
}
